package jmine.tec.purge.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

import jmine.tec.persist.annotation.Alias;
import jmine.tec.persist.annotation.Constraint;
import jmine.tec.persist.annotation.UniqueConstraint;
import jmine.tec.purge.dao.PurgeRequestDAO;

import org.hibernate.validator.NotNull;

import bancosys.tec.component.Documentation;
import bancosys.tec.persist.bussobj.PersistableBusinessObject;
import bancosys.tec.persist.persister.annotation.NaturalKey;
import bancosys.tec.persist.persister.annotation.SystemId;

/**
 * Configuração de expurgo.
 * 
 * @author Marcio Ribeiro (mmr)
 * @created Aug 8, 2011
 */
@Entity
@Table(name = "PURGE_CONFIG")
@Alias("PURCFG")
@SequenceGenerator(name = "SEQ_PURCFG", sequenceName = "SEQ_PURCFG")
@Documentation("CONFIGURAÇÃO DE EXPURGOS.")
public class PurgeConfig extends PersistableBusinessObject {
    private Long id;

    private String name;

    private String description;

    private Integer daysToKeep;

    private String cronExpression;

    private Integer maxWindowSize;

    private Boolean enabled;

    private String purgerBeanName;

    /**
     * @return valor do campo id.
     */
    @Id
    @SystemId
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_PURCFG")
    @Column(name = "COD_PURGE_CONFIG", nullable = false)
    @Documentation("CÓDIGO DO EXPURGO")
    public Long getId() {
        return this.id;
    }

    /**
     * Define valor para campo id.
     * 
     * @param id valor para campo id.
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * @return valor do campo name.
     */
    @NotNull
    @NaturalKey
    @UniqueConstraint(suffix = "JT_0")
    @Column(name = "NAME", nullable = false)
    @Documentation("NOME ÚNICO DA CONFIGURAÇÃO DO EXPURGO")
    public String getName() {
        return this.name;
    }

    /**
     * Define valor para campo name.
     * 
     * @param name valor para campo name.
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return valor do campo description.
     */
    @Column(name = "DESCR")
    @Documentation("DESCRIÇÃO DO EXPURGO")
    public String getDescription() {
        return this.description;
    }

    /**
     * Define valor para campo description.
     * 
     * @param description valor para campo description.
     */
    public void setDescription(String description) {
        this.description = description;
    }

    /**
     * @return valor do campo daysToKeep.
     */
    @NotNull
    @Column(name = "DAYS_TO_KEEP", nullable = false)
    @Documentation("DIAS PARA MANTER")
    public Integer getDaysToKeep() {
        return this.daysToKeep;
    }

    /**
     * Define valor para campo daysToKeep.
     * 
     * @param daysToKeep valor para campo daysToKeep.
     */
    public void setDaysToKeep(Integer daysToKeep) {
        this.daysToKeep = daysToKeep;
    }

    /**
     * @return valor do campo cronExpression.
     */
    @Column(name = "CRON_EXPRESSION")
    @Documentation("PERIODICIDADE DE EXECUÇÃO DE EXPURGO EM FORMATO DE EXPRESSÃO CRON")
    public String getCronExpression() {
        return this.cronExpression;
    }

    /**
     * Define valor para campo cronExpression.
     * 
     * @param cronExpression valor para campo cronExpression.
     */
    public void setCronExpression(String cronExpression) {
        this.cronExpression = cronExpression;
    }

    /**
     * @return valor do campo enabled.
     */
    @NotNull
    @Constraint(suffix = "JT_0")
    @Column(name = "ENABLED", nullable = false)
    @Documentation("INDICA SE ESSA CONFIGURAÇÃO DE EXPURGO ESTÁ ATIVA OU NÃO")
    public Boolean isEnabled() {
        return this.enabled;
    }

    /**
     * Define valor para campo enabled.
     * 
     * @param enabled valor para campo enabled.
     */
    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    /**
     * @return valor do campo maxWindowSize.
     */
    @NotNull
    @Column(name = "MAX_WINDOW_SIZE", nullable = false)
    @Documentation("TAMANHO MÁXIMO DA JANELA DE EXPURGO")
    public Integer getMaxWindowSize() {
        return this.maxWindowSize;
    }

    /**
     * Define valor para campo maxWindowSize.
     * 
     * @param maxWindowSize valor para campo maxWindowSize.
     */
    public void setMaxWindowSize(Integer maxWindowSize) {
        this.maxWindowSize = maxWindowSize;
    }

    /**
     * @return valor do campo purgerBeanName.
     */
    @NotNull
    @Column(name = "PURGER_BEAN_NAME", nullable = false)
    @Documentation("NOME DO BEAN DO SPRING QUE EXECUTA BUSINESS ESPECÍFICO DE EXPURGO")
    public String getPurgerBeanName() {
        return this.purgerBeanName;
    }

    /**
     * Define valor para campo purgerBeanName.
     * 
     * @param purgerBeanName valor para campo purgerBeanName.
     */
    public void setPurgerBeanName(String purgerBeanName) {
        this.purgerBeanName = purgerBeanName;
    }

    /**
     * @return ultima requisição de expurgo para essa configuracao.
     */
    @Transient
    public PurgeRequest getLastRequest() {
        return this.getController().getDAOFactory().getDAOByClass(PurgeRequestDAO.class).findLastRequest(this);
    }

    /**
     * Ativa essa configuracao.
     */
    public void enable() {
        this.enabled = true;
        this.getPersister().save();
    }

    /**
     * Desabilita essa configuracao.
     */
    public void disable() {
        this.enabled = false;
        this.getPersister().save();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String toString() {
        return this.name;
    }
}
